package main

import (
	"context"
	"dingbot/config"
	"dingbot/utils"
	"fmt"
	"github.com/open-dingtalk/dingtalk-stream-sdk-go/chatbot"
	"github.com/open-dingtalk/dingtalk-stream-sdk-go/client"
	"github.com/open-dingtalk/dingtalk-stream-sdk-go/logger"
	"io/ioutil"
)

// 处理用户消息的函数
func processUserMessage(ctx context.Context, data *chatbot.BotCallbackDataModel) ([]byte, error) {
	// 将接收到的消息内容存储到 userMessage 中
	userMessage := data.Text.Content
	fmt.Println(userMessage)

	// 如果用户消息的第一个字符是 #，则调用生成图片的函数
	if userMessage[0] == '#' || userMessage[1] == '#' {
		return processImageMessage(ctx, data)
	} else {
		return processTextMessage(ctx, data)
	}
}

// 处理图片消息的函数
func processImageMessage(ctx context.Context, data *chatbot.BotCallbackDataModel) ([]byte, error) {
	userMessage := data.Text.Content
	// 截取 # 后面的内容作为 prompts
	pro, err := utils.GetChoiceMessagePic(userMessage)
	if err != nil {
		// 处理错误
		return nil, err
	}
	fmt.Println(pro)
	// 生成图片的编码
	images, err := utils.GenerateImages(pro)
	if err != nil {
		// 处理错误
		return nil, err
	}

	// 保存图片数据到文件
	for i, imageData := range images {
		err := ioutil.WriteFile(fmt.Sprintf("image%d.jpg", i+1), imageData, 0644)
		if err != nil {
			// 处理错误
			continue
		}
		fmt.Println("Image", i+1, "saved successfully")
	}

	// 生成图片链接
	pictureUrl, err := utils.ToPicture()
	if err != nil {
		// 处理错误
		return nil, err
	}

	// 返回图片链接
	return []byte(fmt.Sprintf("![图来咯](%s)", pictureUrl)), nil
}

// 处理文本消息的函数
func processTextMessage(ctx context.Context, data *chatbot.BotCallbackDataModel) ([]byte, error) {
	// 处理其他类型的消息
	userMessage := data.Text.Content
	fmt.Println(userMessage)
	// 获取选择消息
	choiceMessage, err := utils.GetChoiceMessage(userMessage)
	fmt.Println(choiceMessage)
	if err != nil {
		// 处理错误
		return nil, err
	}

	// 返回选择消息的文本
	return []byte(choiceMessage), nil
}

// OnChatBotMessageReceived 函数调用处理用户消息的函数
func OnChatBotMessageReceived(ctx context.Context, data *chatbot.BotCallbackDataModel) ([]byte, error) {
	// 处理用户消息
	reply, err := processUserMessage(ctx, data)
	if err != nil {
		return nil, err
	}
	//fmt.Println(byte[reply])
	// 发送回复消息
	replier := chatbot.NewChatbotReplier()
	if err := replier.SimpleReplyMarkdown(ctx, data.SessionWebhook, []byte("信息来咯"), reply); err != nil {
		return nil, err
	}

	return reply, nil
}

func main() {
	// 初始化配置，只需要调用一次
	configFile := "config/config.yaml"
	config.InitConfig(configFile)

	// 获取配置实例
	conf := config.GetConfig()
	clientId := conf.API.ClientId
	clientSecret := conf.API.ClientSecret
	//
	if len(clientId) == 0 || len(clientSecret) == 0 {
		panic("command line options --client_id and --client_secret required")
	}

	logger.SetLogger(logger.NewStdTestLogger())

	cli := client.NewStreamClient(client.WithAppCredential(client.NewAppCredentialConfig(clientId, clientSecret)))

	cli.RegisterChatBotCallbackRouter(OnChatBotMessageReceived)
	err := cli.Start(context.Background())
	if err != nil {
		panic(err)
	}

	select {}
}
